GCP 相比於其他雲,多了 Project(專案) 層級,在規劃 GCP 架構時往往以環境來區分專案,在每個專案下都有各自獨立的 VPC,當規模越來越大時會造成 VPC 太多,IP 容易造成衝突難以維護,且由於 GKE 控制節點的特殊架構(下篇文章會提到),無法像 AWS 一樣,較難使用 VPC Peering 的方式來連接不同專案下的 GKE,為了解決以上的痛點,GCP 的 Shared VPC 就派上用場了。
Shared VPC 可以讓數個 Projects(專案) 連結相同的 VPC Network,讓這些 Projects 能夠安全、有效率地使用內網傳輸。
如下圖,Shared VPC 的架構為一個 Host Project 連接多個 Service Project。Host project 的 VPC Networks 就稱為 Shared VPC Networks。而位於 Service project 的相關資源可以使用 Shared VPC Networks 的 Subnets。如下圖
具有共享 VPC 網絡的宿主項目會為兩個服務項目提供內部連接,而獨立項目不使用共享 VPC。
在 GCP 創建兩個專案,分別是 ithome-202409-demo 及 ithome-202409-demo-2,本章節要介紹將兩個專案設定成 Shared VPC 的模式讓多個不同專案但是使用同一個 VPC,其中以 ithome-202409-demo 作為 Shared VPC Host project,ithome-202409-demo-2 作為 Shared VPC Service project。
如下表,本章節只示範建立 Shared VPC,表中的 Proxy VPC 可以請讀者當做練習,之後的文章會使用到。
以 Terraform 在 ithome-202409-demo 專案創建 VPC 以及 Subnet,同時記得建立次要 IPv4 範圍給 GKE 中的 Pod 和 Service 使用。
因為篇幅有限,已經將 main.tf, variable.tf, provider.tf 合併在同一份 yaml 內,在正式環境中,為了方便維護一般都會拆分開來。
# provider.tf
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "5.4.0"
}
}
backend "gcs" {
#將tfstat狀態文件保存到GCS
bucket = "tfstat保存的GCS bucket"
prefix = "network/demo-project-tfstate"
}
required_version = ">= 0.14"
}
provider "google" {
project = "${var.project_id}"
}
# variable.tf
variable "project_id" {
description = "The project ID to host the network in"
default = "ithome-202409-demo"
}
variable "vpc" {
description = "VPC Name"
default = "ithome-202409-demo-vpc"
}
variable "subnet-01" {
description = "subnet Name"
default = "ithome-202409-demo-us-central1-subnet"
}
variable "subnet-02" {
description = "subnet Name"
default = "ithome-202409-demo-2-us-central1-subnet"
}
# main.tf
module "vpc" {
source = "terraform-google-modules/network/google"
version = "~> 7.5"
project_id = "${var.project_id}"
network_name = "${var.vpc}"
routing_mode = "REGIONAL"
auto_create_subnetworks = "false"
description = "This Shared VPC use for demo GKE Cluster and created by Terraform"
subnets = [
{
subnet_name = "${var.subnet-01}"
description = "ithome-202409-demo-subnet node ip range"
subnet_ip = "10.120.0.0/20" #10.120.0.1-10.120.15.254
subnet_region = "us-central1"
subnet_private_access = "true"
},
{
subnet_name = "${var.subnet-02}"
description = "ithome-202409-demo-2-subnet node ip range"
subnet_ip = "10.120.64.0/20" #10.120.64.1-10.120.79.254
subnet_region = "us-central1"
subnet_private_access = "true"
},
]
secondary_ranges = {
"${var.subnet-01}" = [
#ithome-202409-demo-us-central1-subnet pod ip range
{
range_name = "ithome-202409-demo-pod-subnet"
ip_cidr_range = "10.120.16.0/20" #10.120.16.1-10.120.31.254
},
#ithome-202409-demo-us-central1-subnet service ip range
{
range_name = "ithome-202409-demo-service-subnet"
ip_cidr_range = "10.120.32.0/20" #10.120.32.1-10.120.47.254
},
]
"${var.subnet-02}" = [
#ithome-202409-demo-2-us-central1-subnet pod ip range
{
range_name = "ithome-202409-demo-2-pod-subnet"
ip_cidr_range = "10.120.80.0/20" #10.120.80.1-10.120.95.254
},
#ithome-202409-demo-2-us-central1-subnet service ip range
{
range_name = "ithome-202409-demo-2-service-subnet"
ip_cidr_range = "10.120.96.0/20" #10.120.96.1-10.120.111.254
},
]
}
]
}
在主要專案中設定Shared VPC
授予 ithome-202409-demo-2 專案使用子網路 Subnet 創建 GKE 的權限,我以 ithome-202409-demo-2 的專案編號(407205409614)為範例。
'專案編號'-compute@developer.gserviceaccount.com
'專案編號'@cloudservices.gserviceaccount.com
service-'專案編號'@container-engine-robot.iam.gserviceaccount.com
407205409614@cloudservices.gserviceaccount.com
407205409614-compute@developer.gserviceaccount.com
service-407205409614@container-engine-robot.iam.gserviceaccount.com
在這篇文章中,我們深入探討了 GCP Shared VPC 的概念及其優勢,特別是在簡化 GKE 網路管理方面的應用。我們還演示了如何利用 Terraform 這一強大的基礎設施即代碼工具,以可重複且高效的方式設置 Shared VPC。
通過遵循這些步驟,可以為接下來文章所要介紹的 Google Kubernetes Engine (GKE)叢集建立一個集中化且安全管理的網絡基礎設施,為容器化應用程序提供堅實的基礎。